데이터 변경은 좀처럼 단독으로 일어나지 않습니다. 송금은 한 계좌에서 출금하고 다른 계좌에 입금해야 하며, 주문은 재고를 확보하고 결제를 기록해야 합니다. 시스템이 중간에 멈추면 데이터베이스는 존재한 적 없는 상태를 묘사하게 됩니다. 트랜잭션 은 이러한 문제에 대한 데이터베이스의 해답입니다. 즉, 데이터베이스가 다음과 같이 취급하는 하나 이상의 연산 시퀀스입니다. 단일하고 분할할 수 없는 작업 단위.
전부 아니면 전무
트랜잭션 내부에서는 모든 연산이 하나의 결과에 속합니다. 데이터베이스는 트랜잭션의 일부만 수행된 완료 상태를 결코 노출하지 않습니다. 고전적인 예는 두 은행 계좌 간의 송금입니다. 출금 계좌의 잔액을 줄인 다음 입금 계좌의 잔액을 늘립니다. 첫 번째 단계만 성공하면 돈이 사라지고, 두 번째 단계만 성공하면 돈이 갑자기 나타납니다. 두 단계를 하나의 트랜잭션으로 묶으면 두 가지 문제 모두 사라집니다.
이러한 전부 아니면 전무 보장을 원자성. 커밋 은 트랜잭션의 변경 사항을 영구적으로 만드는 행위입니다. 커밋되지 않은 트랜잭션은 아무 흔적도 남기지 않습니다. 지속성 은 마지막 퍼즐 조각을 더합니다. 즉, 커밋이 반환된 후에는 잠시 뒤에 기계의 전원이 꺼져도 변경 사항이 유지됩니다.
트랜잭션은 경계입니다
트랜잭션을 여러 문장을 둘러싼 경계로 상상하면 이해하기 쉽습니다. 경계 이전과 이후에는 데이터가 구조가 부과하는 규칙을 만족합니다. 경계 내부에는 중간 상태가 존재합니다. 즉, 한 계좌는 이미 인출되었지만 다른 계좌는 아직 입금되지 않은 상태입니다. 그러나 그 상태는 트랜잭션에만 속합니다. 다른 세션의 이후 문장들은 이를 진실로 취급하지 않습니다.
동시에 수행하는 두 가지 역할
따라서 트랜잭션은 두 가지 역할을 합니다. 첫 번째는 장애 처리입니다. 프로세스가 충돌하거나, 연결이 끊기거나, 문장에서 오류가 발생하면 데이터베이스는 트랜잭션이 시작되기 전의 상태로 복원할 수 있습니다. 두 번째는 가시성 제어입니다. 작업이 진행되는 동안 다른 읽기 작업은 미완성 결과로부터 보호됩니다. 이 두 역할은 관련이 있지만 동일하지는 않습니다. 원자성은 변경 사항이 유지되는지를 결정하고, 가시성은 동시 트랜잭션이 서로를 얼마나 볼 수 있는지를 제어하는 설정인 격리 수준에 의해 결정됩니다.
